#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <string>
#include <cstdio>

int flag = 0;
//父子线程之间共享大部分数据和代码

//可能会出现有两个线程同时进入这个formatid函数，我们使用的缓冲区不是全局的，所以是可重入函数
std::string FormatId(const pthread_t& tid)
{
    char id[64];
    snprintf(id, sizeof(id), "0x%lx", tid);
    return id;
}

void* thread_function(void* args)
{
    std::string name = static_cast<char*>(args);
    pthread_t tid = pthread_self();
    int cnt = 10;
    while(cnt--)
    {
        std::cout << "我是子线程" << cnt << ":" << name << std::endl;
        std::cout << "我的tid是" << FormatId(pthread_self()) << std::endl;//右值可以传给const左值
        std::cout << "我的flag值是：" << flag-- << std::endl;
        sleep(1);
    }
    return (void*)1000;
}

void showtid(pthread_t& tid)
{
    //需要用unsigned long int
    printf("tid: 0x%lx\n", tid);
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, thread_function, (void*)"thread_1");

    std::cout << "我的tid是" << pthread_self() << std::endl;
    std::cout << "我的main-flag是" << flag-- << std::endl;

    void* ret;
    pthread_join(tid, &ret);
    std::cout << "退出结果是:" << (long long int)ret << std::endl;
    //为什么只有退出码而没有异常相关的信号呢？
    //因为等待的线程出了问题，整个进程都推出了，所有线程都会退出，没有人接受，也就返回的没有意义
    //join都是给予线程正常跑完的情况，异常信号是进程需要处理的话题
    return 0;
}